function setupEventListeners(self) {
  var option = {
    down: false,
    clickActive: true,
    lastX: 0,
    lastY: 0,
    downX: 0,
    downY: 0,
    ongoingTouches: {},
    activeTouch: null,
  };

  self.mouseCurrent = {clientX: 0, clientY: 0};
  self.touchMode = false;

  // 綁定事件 - 窗口变化
  setupResizeEvent(self);
  // 綁定事件 - 移动端 触摸
  setupTouchEvent(self, option);
  // 綁定事件 - PC端 鼠标
  bindEventMousemove(self, option);





  var tmpMat4 = new THREE.Matrix4();
  var tmpMat4B = new THREE.Matrix4();
  self.moveToScreenCoords = function( obj, camera, rect ) {
    var x = 2.0 * ((rect.left+10) / window.innerWidth) - 1;
    var y = -2.0 * ((rect.top+10) / window.innerHeight) + 1;

    var mouse3D = new THREE.Vector3( x, y, 0.5 );
    mouse3D.unproject( camera );
    mouse3D.sub( camera.position );
    mouse3D.normalize();

    var raycaster = new THREE.Raycaster( camera.position, mouse3D );
    var intersects = raycaster.intersectObjects( [self.linesPlane] );

    if (intersects.length > 0) {
      obj.position.copy(intersects[0].point);
    }
  };

  self.mouseX = -1;
  self.mouseY = -1;
  self.findObjectUnderEvent = function(ev) {
    if (!self.objects) {
      return;
    }
    self.mouseX = ev.clientX;
    self.mouseY = ev.clientY;
    var mouse3D = new THREE.Vector3(
      ( ev.clientX / self.width ) * 2 - 1,
      -( ev.clientY / self.height ) * 2 + 1,
      0.5
    );
    mouse3D.unproject( self.camera );
    mouse3D.sub( self.camera.position );
    mouse3D.normalize();
    var raycaster = new THREE.Raycaster( self.camera.position, mouse3D );
    var intersects = raycaster.intersectObjects( self.objects.blobs.children.filter(function(c) { return !c.disabled; }) );
    if ( intersects.length > 0 ) {
      var obj = intersects[ 0 ].object
      return obj;
    }
  };

  self.findToolbarUnderEvent = function(ev) {
    if (!self.toolBar3D) {
      return;
    }
    self.mouseX = ev.clientX;
    self.mouseY = ev.clientY;
    var mouse3D = new THREE.Vector3(
      ( ev.clientX / self.width ) * 2 - 1,
      -( ev.clientY / self.height ) * 2 + 1,
      0.5
    );
    mouse3D.unproject( self.camera );
    mouse3D.sub( self.camera.position );
    mouse3D.normalize();
    var raycaster = new THREE.Raycaster( self.camera.position, mouse3D );
    var intersects = raycaster.intersectObjects( self.toolBar3D.buttons );
    if ( intersects.length > 0 ) {
      var obj = intersects[ 0 ].object
      return obj;
    }
  };
}
